package cn.iocoder.yudao.module.eval.service.rule;

import cn.iocoder.yudao.module.eval.dal.dataobject.candidate.EvalCandidateInfoDO;
import cn.iocoder.yudao.module.eval.dal.dataobject.plan.EvalPlanDO;
import cn.iocoder.yudao.module.eval.dal.dataobject.score.EvalScoreRecordDO;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 评价业务规则 Service 接口
 *
 * @author 芋道源码
 */
public interface EvalBusinessRuleService {

    /**
     * 验证申报条件
     *
     * @param candidateInfo 参评人员信息
     * @param plan 评价计划
     * @return 验证结果
     */
    Object validateApplicationConditions(EvalCandidateInfoDO candidateInfo, EvalPlanDO plan);

    /**
     * 验证资格审核条件
     *
     * @param candidateInfo 参评人员信息
     * @return 验证结果
     */
    Object validateQualificationConditions(EvalCandidateInfoDO candidateInfo);

    /**
     * 计算综合成绩
     *
     * @param scoreRecords 评分记录列表
     * @param calculationRules 计算规则
     * @return 计算结果
     */
    Object calculateComprehensiveScore(List<EvalScoreRecordDO> scoreRecords, Map<String, Object> calculationRules);

    /**
     * 判断是否合格
     *
     * @param totalScore 总分
     * @param subjectScores 分科目成绩
     * @param passingRules 合格规则
     * @return 是否合格
     */
    boolean isQualified(BigDecimal totalScore, Map<String, BigDecimal> subjectScores, Map<String, Object> passingRules);

    /**
     * 计算等级评定
     *
     * @param totalScore 总分
     * @param gradingRules 等级评定规则
     * @return 等级
     */
    String calculateGradeLevel(BigDecimal totalScore, Map<String, Object> gradingRules);

    /**
     * 验证考评员资质
     *
     * @param evaluatorId 考评员ID
     * @param professionCode 职业代码
     * @param skillLevel 技能等级
     * @return 验证结果
     */
    Object validateEvaluatorQualification(Long evaluatorId, String professionCode, String skillLevel);

    /**
     * 验证评分数据完整性
     *
     * @param scoreRecord 评分记录
     * @return 验证结果
     */
    Object validateScoreDataIntegrity(EvalScoreRecordDO scoreRecord);

    /**
     * 检查时间冲突
     *
     * @param planId 计划ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 冲突检查结果
     */
    Object checkTimeConflict(Long planId, java.time.LocalDateTime startTime, java.time.LocalDateTime endTime);

    /**
     * 验证人员分配规则
     *
     * @param planId 计划ID
     * @param userId 用户ID
     * @param personType 人员类型
     * @return 验证结果
     */
    Object validatePersonnelAssignmentRules(Long planId, Long userId, Integer personType);

    /**
     * 计算考勤得分
     *
     * @param attendanceRecords 考勤记录
     * @param attendanceRules 考勤规则
     * @return 考勤得分
     */
    BigDecimal calculateAttendanceScore(List<Object> attendanceRecords, Map<String, Object> attendanceRules);

    /**
     * 验证材料完整性
     *
     * @param candidateId 参评人员ID
     * @param requiredMaterials 必需材料列表
     * @return 验证结果
     */
    Object validateMaterialCompleteness(Long candidateId, List<String> requiredMaterials);

    /**
     * 检查评价计划容量
     *
     * @param planId 计划ID
     * @param additionalCount 新增人数
     * @return 容量检查结果
     */
    Object checkPlanCapacity(Long planId, Integer additionalCount);

}
